package cn.minimelon.api.utils;

import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.minimelon.api.constant.Constants;
import org.noear.solon.core.handle.Context;
import org.noear.solon.i18n.I18nUtil;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;

/**
 * 自定义工具类型
 */
public class MelonUtils {

    /**
     * 调用生成雪花ID
     *
     * @param prefix 前缀
     * @return 雪花ID
     */
    public static String snowId(String prefix) {
        long id = IdUtil.getSnowflake().nextId();
        return StrUtil.trim(prefix) + id;
    }

    /**
     * 判断是否是http协议
     *
     * @param link 连接URL
     * @return true：http协议
     */
    public static boolean isHttp(String link) {
        if (StrUtil.isNotEmpty(link)) {
            return link.indexOf(Constants.HTTP) == 0 || link.indexOf(Constants.HTTPS) == 0;
        }
        return false;
    }

    /**
     * 根据消息键和参数 获取消息 委托给spring messageSource
     *
     * @param key  消息键
     * @param args 参数
     * @return 获取国际化翻译值
     */
    public static String message(String key, Object... args) {
        return I18nUtil.getMessage(Context.current(), key, args);
    }

    /**
     * 去重
     * 示例：属性ID去重
     * list.stream()
     *     .filter(MelonUtils.distinct(DataPropVO::getUid))
     *     .collect(Collectors.toList());
     *
     * @param keyExtractor 去重方法
     * @param <T> 模板类型
     * @return 判断去重的方法
     */
    public static <T> Predicate<T> distinct(Function<? super T, ?> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
}
